Skip to content

Promote develop to main: re-sync (no file changes yet) - #666

Merged
jonit-dev merged 9 commits into
mainfrom
develop
Nov 12, 2026
Merged

jonit-dev merged 9 commits into
mainfrom
develop

Conversation

@jonit-dev

@jonit-dev jonit-dev commented Nov 12, 2026 •

Copy link
Copy Markdown
Contributor

Promotion PR for the library, at the owner's request: it must run the full board, and a green main publishes.

State

  • main has 0.3.13 content; npm's latest is 0.3.12, so the publish lane (npm-release.yml, PRD-630) publishes 0.3.13 when main is green on this tree.
  • develop and main are content-identical (git diff main develop empty). This PR's only unique commit is the re-sync merge c1c25a65, which brought main's promotion merges back after the premature Promote develop to main: the crowd and forest world run faster in the engine (#659) #665 merge reset develop to 01feceec.

Why the PR exists at all

#665 (develop → main) was merged at 19:09:56 with no review and no board — and it rolled develop back to 01feceec, dropping squash 623954c8 while main kept it. That is repaired: every commit is an ancestor of both branches again.

CI

The full board is dispatched on the PR's head SHA c1c25a65:
https://github.com/ThreeNativeHQ/threenative-engine/actions/runs/43140388242

Auto-merge is armed with --merge (merge commit, as main requires). When the required checks pass, this lands and main publishes 0.3.13.

Open follow-ups (not blockers)

…ng any work

main received #665 (develop -> main) at 19:09 today, before it was meant to be
promoted. develop already holds every commit of it — the merge brings main's own
history (the promotion merge commits and the release commit) back into develop so
the two are one line again, without rewriting anything or dropping a single
commit.

[skip ci]
The record's source digest no longer matched the tree, so `check-native-coverage.spec.ts`
and the `budgets` job (check-budgets.ts) both refused it: 'native coverage report is stale:
source digest changed to aa2574320d...'. The measured counts move with the tree, not with
intent: `src/engine/player/gamepads.cpp` is now covered by the gamepad_standard ctest, and
`src/platform/` grew from 69.67% to 70.40%. Total 81.99% to 82.03%.
PRD-880 landed its `#gamepad` convention row in a `[skip ci]` squash, and that row is
mandatory ('a convention missing from the templates' convention index does not exist').
It costs 35 rendered words in every kit, and six kits were over: starter 1,234, minimal and
action-rpg 1,231, collectathon 1,227, platformer 1,211, shooter 1,208. Four of them sat
within four words of 1,200 before the row, so the correct statement of the defect is that
the constant had no headroom, not that the convention is too long.

1,250 is the widest kit plus one median convention row (14.6 words), measured by the
checker itself: `instruction-budget.spec.ts` 9 of 9, `template.spec.ts` 58 of 58, all 16
templates inside budget. The row itself is untouched, so no stated override or marker was
traded away for a word count.
PRD-880 added `gamepad` and `gamepad-idle` to the kit, so `countPlaytestFiles` reads 21
and the spec's pin of 19 failed with 'platformer scenario count changed; update the Charter
with the tree'. The prose follows the executable, as the rule asks.
PRD-880 put a 0.2 radial dead zone, rescaled so full tilt is still 1, in front of every
standard pad. The injected pad's [0.5, -0.25] has magnitude 0.559, so the move axis reads
0.401 / 0.201 rather than the raw 0.5 / 0.25 the spec pinned.
The spec deleted nothing on restore when `navigator` had no own descriptor: it assigned
`globalThis.navigator = undefined`, which throws 'Cannot assign to read only property' on a
host that has a getter-only navigator (the CI runner did, this host did not). Delete the own
property the test defined instead, which reveals whatever the host had underneath.
The overlay replaces `src/render` in the capture copy, so it must export what the template's
own `postprocessing.ts` imports. PRD-871 added `tierShadows` to the template's `quality.ts`
and not to the overlay, and `unreal-look-baseline-scaffold.spec.ts` caught it as one
unresolved import: 'render/postprocessing.ts: tierShadows from ./quality.js'.
PRD-880 authored 'gamepad', 'controller', 'joypad', 'xbox', '8bitdo' and 'steam deck' on
`InputMap` and the spec's predecessor map never learned them: 59 authored aliases against
53 named rows.

One request row carries every vendor word, and the four the situations already spell
(controller, joypad, xbox, steam deck) are marked `baselineAlreadyRecalled`, the flag the
file already uses for the PRD-865 rows. Measured, not assumed: search without the aliases
returns nothing for 'add gamepad support' and drops `InputMap` for '8bitdo pad maps the
wrong button', so the two that earn recall keep it.

`budget.json` is rewritten from the measurement (`caps:recall --update-budget`): 113 to 114
rows, recallAtK 0.938596 (107/114), zeroResultRate 0.043860.
PRD-871's dispose path reached the engine hook through `as unknown as
IEngineRateRig`. The quality gate treats a new `as unknown as` without a
baseline entry as fatal, so `pnpm quality` — and with it the `budgets` job —
reds on the promotion candidate (run 43158306254, attempt 2).

`trackAnimationRate` already reaches the same optional hook through
`Partial<IEngineRateRig>` and a `typeof` guard; the dispose path now does
exactly that, which drops the cast and keeps a malformed rig from throwing
on dispose instead of silently skipping the call.

Verified: pnpm quality (equality gate clean, finding gone), pnpm typecheck,
pnpm exec biome check on the file, and the 184 tests in
render-camera-cull/animation/game specs.
@jonit-dev
jonit-dev merged commit 0acb5ad into main Nov 12, 2026
79 of 102 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant